[2018_Xiomara] [REV] Fortune Jack¶
문제 내용¶
If your smartphone gets connected to a VPN, you feel like you won a lucky draw.
Lucky_Drawer.exe
문제 풀이¶
실행 시 로또같은 화면이 나오며, Generate 버튼 클릭 시 가운데 숫자가 변경되며 "Sorry You are Not So Lucky :( OH!" 메시지 출력 ilspy로 디컴파일한 뒤, 출력되는 문자열을 검색하면 다음 코드 부분을 확인할 수 있음.
// XiomaraChallenge.Form1
private void checkflag(int key)
{
StringBuilder stringBuilder = new StringBuilder();
string str = "xiomara{";
string text = "þæþÖîûìèýÖðæüÖíàíÖàýÖ³\u00a0";
string str2 = "}";
string text2 = "DB2C17E69713C8604A91AA7A51CBA041";
for (int i = 0; i < text.Length; i++)
{
stringBuilder.Append((char)((int)text[i] ^ key));
}
string text3 = stringBuilder.ToString();
string text4 = Form1.CreateMD5(text3);
bool flag = text4.Equals(text2);
if (flag)
{
this.label3.Text = str + text3 + str2;
this.label3.Visible = true;
}
bool flag2 = text4 != text2;
if (flag2)
{
this.label3.Text = "Sorry You are Not So Lucky :( OH!";
this.label3.Visible = true;
}
}
- 해당 문자열이 출력되지 않으려면 flag2가 false여야 함
- flag2가 false가 되기 위해서는 text4와 text2가 같아야 함.
- text4와 text2가 같기 위해서는 stringBuilder값을 md5한 값이 "DB2C17E69713C8604A91AA7A51CBA041"와 같아야 함.
- md5값을 확인하기 위해서는 임의값 입력을 통한 브루트포싱을 진행
#-*- coding: utf-8 -*-
from hashlib import md5
arr = u"þæþÖîûìèýÖðæüÖíàíÖàýÖ³\u00a0"
md5hash = "db2c17e69713c8604a91aa7a51cba041"
for key in range(256):
flag = ''
for b in arr:
flag += chr(key ^ ord(b))
if md5hash == md5(flag.decode("utf-8","ignore").encode('utf-8')).hexdigest():
print("xiomara{" + flag + "}")